package batch.status;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import common.db.jdbc.Jdbc;

import core.config.Env;
import core.exception.PhysicalException;
import core.exception.ThrowableUtil;

/**
 * ジョブ管理マスタクラス
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public final class JobMasterInfoImpl implements JobMasterInfo {

	/** テーブル名 ジョブ管理マスタ */
	private static final String TABLE = Env.getEnv("JobMaster.Table");
	/** カラム名 ジョブID */
	private static final String COL_JOB_ID = Env.getEnv("JobMaster.JobId");
	/** カラム名 多重度 */
	private static final String COL_MULTI = Env.getEnv("JobMaster.Multiplicity");
	/** カラム名 キャンセルタイプ */
	private static final String COL_CTYPE = Env.getEnv("JobMaster.Cancel");
	/** カラム名 開始実行可能時刻 */
	private static final String COL_S_JIKKO = Env.getEnv("JobMaster.Kaishi");
	/** カラム名 終了実行可能時刻 */
	private static final String COL_E_JIKKO = Env.getEnv("JobMaster.Shuryo");

	/**
	 * ジョブ情報取得
	 *
	 * @param conn コネクション
	 * @param jobid ジョブID
	 * @return ジョブ情報
	 */
	@Override
	public JobMaster getJobMasterInfo(final Connection conn, final String jobid) {
		final String query = String.format("SELECT * FROM %s WHERE %s = ? ", TABLE, COL_JOB_ID);

		try (PreparedStatement psmt = Jdbc.wrap(conn).readonlyStatement(query)) {
			psmt.setString(1, jobid);

			JobMaster ret = null;
			try (ResultSet rs = psmt.executeQuery()) {
				if (rs.next()) {
					ret = toJobMasterObject(rs);
				}
			}
			return ret;

		} catch (SQLException ex) {
			ThrowableUtil.error(ex);
			throw new PhysicalException(ex);
		}
	}

	/**
	 * ジョブ管理マスタ取得
	 *
	 * @param conn コネクション
	 * @return マスタリスト
	 */
	@Override
	public List<JobMaster> getJobMasterInfoAll(final Connection conn) {
		final String query = "SELECT * FROM " + TABLE;

		try (PreparedStatement psmt = Jdbc.wrap(conn).readonlyStatement(query)) {
			List<JobMaster> ret = new ArrayList<>();
			try (ResultSet rs = psmt.executeQuery()) {
				while (rs.next()) {
					ret.add(toJobMasterObject(rs));
				}
			}
			return ret;
		} catch (SQLException ex) {
			ThrowableUtil.error(ex);
			throw new PhysicalException(ex);
		}
	}

	/**
	 * テーブル名取得
	 *
	 * @return テーブル名
	 */
	@Override
	public String getTableName() {
		return TABLE;
	}

	/**
	 * ジョブ情報オブジェクト取得
	 *
	 * @param rs 結果セット
	 * @return ジョブ情報オブジェクト
	 * @throws SQLException SQL例外
	 */
	private JobMaster toJobMasterObject(final ResultSet rs) throws SQLException {
		JobMaster ret = new JobMaster();
		ret.setJobId(rs.getString(COL_JOB_ID));
		ret.setMultiplicity(rs.getInt(COL_MULTI));
		ret.setCancelType(rs.getString(COL_CTYPE));
		ret.setRunnableBegin(rs.getString(COL_S_JIKKO));
		ret.setRunnableEnd(rs.getString(COL_E_JIKKO));
		return ret;
	}
}
